#include <iostream>
#include <signal.h>
#include <unistd.h>
using namespace std;

//易变关键字
volatile int flag = 0;

//这个执行流和信号是否产生有关，在住执行流中并没有主动调用这个函数
void change(int signo)//信号捕捉执行流
{
    (void)signo;
    flag = 1;
    printf("change flag 0->1\n");
}

int main()
{
    signal(2,change);
    while(!flag);//住执行流---主执行流并没有对flag做修改
    printf("I exited normally.\n");
    return 0;
}


// void PrintBlock()
// {
//     sigset_t set ,oset;
//     sigemptyset(&set);
//     sigemptyset(&oset);
//     sigprocmask(SIG_BLOCK,&set,&oset);//取出block清单
//     for(int i = 31;i >= 1;i--)
//     {
//         //判断是否在信号集当中
//         if(sigismember(&oset,i))
//         {
//             cout<<1;
//         }
//         else 
//         {
//             cout<<0;
//         }
//     }
//     cout<<endl;
// }

// void PrintPending()
// {
//     sigset_t pending;
//     sigpending(&pending);
//     cout<<"pending:";
//     for(int i = 31;i > 0;i--)
//     {
//         //判断是否在信号集当中
//         if(sigismember(&pending,i))
//         {
//             cout<<1;
//         }
//         else 
//         {
//             cout<<0;
//         }
//     }
//     cout<<endl;
// }

// void handler(int signo)
// {
//     static int cnt = 0;
//     cnt++;
//     while(true)
//     {
//         PrintPending();
//         cout<<"get a new signal "<<signo<<" cnt "<<cnt<<endl;
//         sleep(1);
//     }
//     exit(1);
// }

// int main()
// {
//     //结构体
//     struct sigaction act,oact;
//     act.sa_handler = handler;
//     sigemptyset(&act.sa_mask);
//     sigaddset(&act.sa_mask,3);
//     sigaddset(&act.sa_mask,4);
//     sigaddset(&act.sa_mask,5);
//     sigaddset(&act.sa_mask,6);

//     sigaction(2,&act,&oact);
//     while(true)
//     {
//         //PrintBlock();
//         PrintPending();
//         //等待信号
//         pause();
//     }
//     return 0;
// }